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

این راهنما نحوه انتقال از ML Kit برای Firebase ویژه Android را توضیح می‌دهد.

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

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

Vision APIs

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

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

وابستگی‌های کتابخانه‌های ML Kit 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.1

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 را ببینید.

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

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

میانای برنامه‌سازی کاربردیموجود در بسته‌بندیباریک
شناسه زبان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) در جاوا استفاده کنید.
  • همه دستگیره‌ها (آشکارساز/ اسکنر/ برچسب‌زن/ مترجم/...) بستنی هستند. مطمئن شوید که وقتی دیگر از این اشیا استفاده نمی‌شود، روش close() فراخوانده شود. اگر از آن‌ها در Fragment یا AppCompatActivity استفاده می‌کنید، یکی از راه‌های انجام این کار این است که LifecycleOwner.getLifecycle() را در Fragment یا AppCompatActivity فراخوانی کنید، و سپس Lifecycle.addObserver را فراخوانی کنید.
  • ‫processImage() و detectInImage() در میاناهای برنامه‌سازی کاربردی Vision برای یکپارچگی به process() تغییر نام داده‌اند.
  • Natural Language API اکنون به‌جای «کد زبان» از اصطلاح «برچسب زبان» (همان‌طور که توسط استاندارد BCP 47 تعریف شده است) استفاده می‌کند.
  • روش‌های دریافت‌کننده در 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());
  

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

اسکن رمزینه

برای «میانای برنامه‌سازی کاربردی اسکن رمزینه»، اکنون دو روش برای ارائه مدل‌ها وجود دارد:

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

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

تشخیص چهره

برای «میانای برنامه‌سازی کاربردی تشخیص چهره»، مدل‌ها به دو روش می‌توانند ارائه شوند:

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

عملکرد پیاده‌سازی‌ها یکسان است.

ترجمه

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

برچسب‌گذاری تصویر AutoML (منسوخ)

بارگیری مدل‌های سفارشی برای برچسب‌گذاری تصویر بااستفاده از AutoML منسوخ شده است و در ۱۵ ژوئن ۲۰۲۷ غیرفعال خواهد شد. باید از «فضای ذخیره‌سازی ابری» برای میزبانی مدل‌ها استفاده کنید و منطق بارگیری را به برنامه‌تان اضافه کنید تا مدل‌ها را بارگیری کند. برای جزئیات، راهنمای انتقال 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) با افزایه «تطابق‌دهنده نسخه دقیق» جایگزین کنید:

پیش‌از

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) با مسیر کلاس افزایه «تطبیق‌دهنده نسخه دقیق» جایگزین کنید:

پیش‌از

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 حذف کنید.

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

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