درحال انتقال برای Android

این راهنما نحوه انتقال از «کیت یادگیری ماشین برای Firebase» ویژه Android را توضیح می‌دهد.

به‌روزرسانی واردات gradle

کیت توسعه نرم‌افزار ML Kit فقط به یک وابستگی برای هر ML Kit API نیاز دارد. نیازی نیست کتابخانه‌های رایج مثل firebase-ml-vision یا firebase-ml-natural-language را مشخص کنید. «کیت یادگیری ماشین» از فضای نام com.google.android.gms برای کتابخانه‌هایی که به خدمات Google Play وابسته هستند استفاده می‌کند.

Vision APIs

مدل‌های بسته‌ای به‌عنوان بخشی از برنامه شما ارائه می‌شوند. مدل‌های Thin باید بارگیری شوند. برخی‌از میاناهای برنامه‌سازی کاربردی هم به‌صورت بسته‌ای و هم به‌صورت سبک دردسترس هستند، برخی دیگر فقط به یکی از این دو صورت دردسترس هستند:

میانای برنامه‌سازی کاربردیموجود در بسته‌بندیباریک
تشخیص نوشتارx (بتا)x
تشخیص چهرهxx
اسکن کردن رمزینهxx
برچسب‌گذاری تصویرxx
تشخیص و ردیابی اشیاx-

وابستگی‌های کتابخانه‌های Android «کیت یادگیری ماشین» را در فایل Gradle (معمولاً app/build.gradle.kts) ماژول (سطح برنامه) خود مطابق با جدول‌های زیر به‌روز کنید:

مدل‌های بسته‌ای

میانای برنامه‌سازی کاربردیآرتیفکت‌های قدیمیخروجی ساختاریافته جدید
اسکن کردن رمزینه com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.3.0
کانتور چهره com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.7
برچسب‌گذاری تصویر com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.9
تشخیص شیء com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.2

مدل‌های نازک

میانای برنامه‌سازی کاربردیآرتیفکت‌های قدیمیخروجی ساختاریافته جدید
اسکن کردن رمزینه com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
تشخیص چهره com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
تشخیص نوشتار com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.2

AutoMLVision Edge

میانای برنامه‌سازی کاربردیآرتیفکت قدیمیخروجی ساختاریافته جدید
AutoML بدون بارگیری com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
AutoML با بارگیری com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3

برای میزبانی و بارگیری مدل‌های سفارشی، مدل‌هایتان را به Cloud Storage منتقل کنید و منطق بارگیری را در برنامه‌تان اضافه کنید تا آن‌ها را بااستفاده از LocalModel بار کنید. برای جزئیات، راهنمای انتقال Firebase ML به Cloud Storage را ببینید.

میاناهای برنامه‌سازی کاربردی زبان طبیعی

مدل‌های بسته‌ای به‌عنوان بخشی از برنامه شما ارائه می‌شوند. مدل‌های Thin باید بارگیری شوند:

میانای برنامه‌سازی کاربردیموجود در بسته‌بندیباریک
شناسه زبانxx
پاسخ هوشمندxx (بتا)

وابستگی‌های کتابخانه‌های Android «کیت یادگیری ماشین» را در فایل Gradle (معمولاً app/build.gradle.kts) واحد (سطح برنامه) خود مطابق با جدول‌های زیر به‌روز کنید:

مدل‌های بسته‌ای

میانای برنامه‌سازی کاربردیآرتیفکت‌های قدیمیخروجی ساختاریافته جدید
شناسه زبان com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.6
پاسخ هوشمند com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.4

مدل‌های نازک

میانای برنامه‌سازی کاربردیآرتیفکت‌های قدیمیخروجی ساختاریافته جدید
شناسه زبان com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.android.gms:play-services-mlkit-language-id:17.0.0
پاسخ هوشمند com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

به‌روزرسانی نام کلاس‌ها

اگر کلاس شما در این جدول نشان داده می‌شود، تغییرات مشخص‌شده را اعمال کنید:

کلاس قدیمیکلاس جدید
com.google.firebase.ml.common.FirebaseMLException com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.LocalModel

بارگیری دستی لازم است. مدل‌های ازراه‌دور میزبانی‌شده در Firebase منسوخ شده‌اند. برای جزئیات، راهنمای انتقال Firebase ML به Cloud Storage را ببینید.
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

برای کلاس‌های دیگر، این قوانین را دنبال کنید:

  • پیشوند FirebaseVision را از نام کلاس بردارید.
  • پیشوندهای دیگری را که با پیشوند Firebase شروع می‌شوند از نام کلاس بردارید.

همچنین، در نام بسته‌ها، پیشوند com.google.firebase.ml را با com.google.mlkit جایگزین کنید.

به‌روزرسانی نام روش‌ها

تغییرات کد حداقل است:

  • نمونه‌سازی آشکارساز/ اسکنر/ برچسب‌زن/ مترجم... تغییر کرده است. اکنون هر ویژگی نقطه ورودی خودش را دارد. برای مثال: BarcodeScanning، TextRecognition، ImageLabeling، Translation... تماس‌ها با سرویس Firebase getInstance() با تماس‌ها با روش getClient() نقطه ورودی ویژگی جایگزین می‌شود.
  • نمونه‌سازی پیش‌فرض برای TextRecognizer برداشته شده است، زیرا کتابخانه‌های تکمیلی برای تشخیص نویسه‌های دیگر مانند چینی و کره‌ای معرفی کرده‌ایم. برای استفاده از گزینه‌های پیش‌فرض با مدل تشخیص نوشتار لاتین، وابستگی به com.google.android.gms:play-services-mlkit-text-recognition را اعلام کنید و از TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS) استفاده کنید.
  • نمونه‌سازی پیش‌فرض برای ImageLabeler و ObjectDetector برداشته شده است، زیرا پشتیبانی از مدل سفارشی را برای این دو ویژگی معرفی کرده‌ایم. برای مثال، برای استفاده از گزینه‌های پیش‌فرض با مدل پایه در ImageLabeling، وابستگی به com.google.mlkit:image-labeling را اعلام کنید و از ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) در جاوا استفاده کنید.
  • All handles (detector/scanner/labeler/translator...) are closeable. مطمئن شوید که وقتی دیگر از آن اشیاء استفاده نمی‌شود، روش close() فراخوانی شود. اگر از آن‌ها در Fragment یا AppCompatActivity استفاده می‌کنید، یک راه برای انجام این کار این است که LifecycleOwner.getLifecycle() را در Fragment یا AppCompatActivity فراخوانی کنید، و سپس Lifecycle.addObserver را فراخوانی کنید.
  • processImage() و detectInImage() در Vision APIs برای سازگاری به process() تغییر نام داده‌اند.
  • Natural Language API اکنون به‌جای «کد زبان» از اصطلاح «برچسب زبان» (همان‌طور که در استاندارد BCP 47 تعریف شده است) استفاده می‌کند.
  • روش‌های Getter در کلاس‌های xxxOptions برداشته شده‌اند.
  • روش getBitmap() در کلاس InputImage (جایگزین FirebaseVisionImage) دیگر به‌عنوان بخشی از میانای عمومی پشتیبانی نمی‌شود. به BitmapUtils.java در نمونه شروع سریع ML Kit مراجعه کنید تا بیت‌مپ تبدیل‌شده از ورودی‌های مختلف را دریافت کنید.
  • ‫FirebaseVisionImageMetadata برداشته شده است، می‌توانید فقط فراداده تصویر را مثل width،‏ height،‏ rotationDegrees،‏ format به روش‌های ساخت InputImage ارسال کنید.

در اینجا چند نمونه از روش‌های قدیمی و جدید Kotlin آورده شده است:

قدیمی

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

جدید

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add lifecycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

در اینجا چند نمونه از روش‌های قدیمی و جدید Java آورده شده است:

قدیمی

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

جدید

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(
    ImageLabelerOptions.DEFAULT_OPTIONS
);
// Optional: add lifecycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

تغییرات مختص میانای برنامه‌سازی کاربردی

اسکن کردن رمزینه

برای Barcode Scanning API، اکنون دو روش برای ارائه مدل‌ها وجود دارد:

  • ازطریق «خدمات Google Play» یا «thin» (توصیه‌شده) - این روش اندازه برنامه را کاهش می‌دهد و مدل بین برنامه‌ها هم‌رسانی می‌شود. بااین‌حال، توسعه‌دهندگان باید مطمئن شوند که مدل پیش‌از استفاده برای اولین‌بار بارگیری شده است.
  • با APK برنامه‌تان که به آن «بسته‌بندی‌شده» هم می‌گویند - این کار اندازه برنامه را افزایش می‌دهد اما به این معنی است که مدل فوراً قابل‌استفاده است.

این دو پیاده‌سازی کمی متفاوت هستند و نسخه «بسته‌ای» نسبت‌به نسخه «نازک» چند بهبود دارد. جزئیات مربوط به این تفاوت‌ها را می‌توانید در دستورالعمل‌های Barcode Scanning API پیدا کنید.

تشخیص چهره

برای Face Detection API، دو روش برای ارائه مدل‌ها وجود دارد:

  • ازطریق «خدمات Google Play» یا «thin» (توصیه‌شده) - این روش اندازه برنامه را کاهش می‌دهد و مدل بین برنامه‌ها هم‌رسانی می‌شود. بااین‌حال، توسعه‌دهندگان باید مطمئن شوند که مدل پیش‌از استفاده برای اولین‌بار بارگیری شده است.
  • با APK برنامه‌تان، که به آن «بسته‌بندی‌شده» هم می‌گویند - این کار اندازه بارگیری برنامه را افزایش می‌دهد اما به این معنی است که مدل بلافاصله قابل‌استفاده است.

رفتار پیاده‌سازی‌ها یکسان است.

ترجمه

  • TranslateLanguage اکنون به‌جای برچسب‌های زبان (EN) از نام‌های خوانا برای ثابت‌هایش (مثلاً ENGLISH) استفاده می‌کند. این نام‌ها اکنون به‌جای @IntDef، @StringDef هستند و مقدار ثابت، برچسب زبان BCP 47 منطبق است.

AutoML Image Labeling (منسوخ‌شده)

بارگیری مدل‌های سفارشی برای برچسب‌گذاری تصویر بااستفاده از AutoML منسوخ شده است و در ۱۵ ژوئن ۲۰۲۷ غیرفعال خواهد شد. باید از Cloud Storage برای میزبانی مدل‌ها استفاده کنید و منطق بارگیری را به برنامه‌تان اضافه کنید تا مدل‌ها را بارگیری کند. برای جزئیات، به راهنمای انتقال Firebase ML به Cloud Storage مراجعه کنید.

تشخیص و ردیابی اشیا

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

دسته طبقه‌بندی به‌جای عدد صحیح، به‌عنوان نمونه‌ای از DetectedObject.Label برگردانده می‌شود. همه دسته‌های ممکن برای طبقه‌بندی‌کننده کلی در کلاس PredefinedCategory گنجانده شده‌اند.

در اینجا نمونه‌ای از کد Kotlin قدیمی و جدید آورده شده است:

قدیمی

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جدید

if (!object.labels.isEmpty() &&
    object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() &&
    object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

در اینجا نمونه‌ای از کد Java قدیمی و جدید آورده شده است:

قدیمی

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جدید

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

دسته «ناشناخته» برداشته شده است. وقتی اطمینان از طبقه‌بندی شیء پایین باشد، هیچ برچسبی برنمی‌گردانیم.

برداشتن وابستگی‌های Firebase

پس‌از انتقال، وابستگی‌های Firebase را بردارید. این مراحل را دنبال کنید:

  • فایل پیکربندی Firebase را با حذف فایل پیکربندی google-services.json در فهرست راهنمای واحد (سطح برنامه) برنامه‌تان بردارید.
  • افزایه Google Services Gradle را در فایل Gradle (سطح برنامه) ماژولتان (معمولاً app/build.gradle.kts) با افزایه Strict Version Matcher جایگزین کنید:

پیش‌از

plugins {
  id("com.android.application")
  id("com.google.gms.google-services")
}

android {
  // …
}

بعد از

plugins {
  id("com.android.application")
  id("com.google.android.gms.strict-version-matcher-plugin")
}

android {
  // …
}
  • مسیر کلاس افزایه Google Services Gradle را در فایل Gradle (سطح ریشه) پروژه (build.gradle.kts) با مسیر کلاس افزایه Strict Version Matcher جایگزین کنید:

پیش‌از

buildscript {
  dependencies {
    // ...

    classpath("com.google.gms:google-services:4.3.3")
  }
}

بعد از

buildscript {
  dependencies {
    // ...
    classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1")
  }
}

برنامه Firebase خود را در کنسول Firebase طبق دستورالعمل‌های سایت پشتیبانی Firebase حذف کنید.

دریافت راهنمایی

اگر با مشکلی مواجه شدید، لطفاً صفحه انجمن ما را بررسی کنید که در آن کانال‌های موجود برای تماس با ما را شرح داده‌ایم.