مهاجرت برای اندروید

به‌روزرسانی ایمپورت‌های گرادل

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

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

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

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

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

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

رابط برنامه‌نویسی کاربردی آثار باستانی مصنوع جدید
اسکن بارکد 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

رابط برنامه‌نویسی کاربردی مصنوع قدیمی مصنوع جدید
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
com.google.mlkit:linkfirebase:17.0.0

API های زبان طبیعی

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

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

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

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

رابط برنامه‌نویسی کاربردی آثار باستانی مصنوع جدید
شناسه زبان 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.labeler.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.CustomRemoteModel
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 جایگزین کنید.

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

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

  • نمونه‌سازی آشکارساز/اسکنر/برچسب‌گذار/مترجم… تغییر کرده است. اکنون هر ویژگی نقطه ورود خاص خود را دارد. برای مثال: اسکن بارکد، تشخیص متن، برچسب‌گذاری تصویر، ترجمه…. فراخوانی‌های سرویس 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) در جاوا استفاده کنید.
  • همه دستگیره‌ها (detector/scanner/labeler/translator…) قابل بستن هستند. مطمئن شوید که متد close() زمانی فراخوانی می‌شود که دیگر از آن اشیاء استفاده نخواهد شد. اگر از آنها در یک Fragment یا AppCompatActivity استفاده می‌کنید، یک راه آسان برای انجام این کار فراخوانی LifecycleOwner.getLifecycle() در Fragment یا AppCompatActivity و سپس فراخوانی Lifecycle.addObserver است.
  • processImage() و detectInImage() در رابط‌های برنامه‌نویسی Vision برای سازگاری بیشتر به process() تغییر نام داده‌اند .
  • رابط‌های برنامه‌نویسی کاربردی زبان طبیعی (NLP) اکنون به جای «کد زبان» از اصطلاح «برچسب زبان» (مطابق تعریف استاندارد BCP 47 ) استفاده می‌کنند.
  • متدهای Getter در کلاس‌های xxxOptions حذف شده‌اند.
  • متد getBitmap() در کلاس InputImage (جایگزین FirebaseVisionImage ) دیگر به عنوان بخشی از رابط عمومی پشتیبانی نمی‌شود. لطفاً برای دریافت تبدیل بیت‌مپ از ورودی‌های مختلف، به نمونه شروع سریع BitmapUtils.java در ML Kit مراجعه کنید.
  • FirebaseVisionImageMetadata حذف شده است، شما می‌توانید فقط متادیتای تصویر مانند عرض، ارتفاع، چرخش، درجه و فرمت را به متدهای ساخت InputImages منتقل کنید.

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

قدیمی

// 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 life cycle 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())
  

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

قدیمی

// 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 life cycle 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());
  

تغییرات خاص API

اسکن بارکد

برای API اسکن بارکد، اکنون دو روش برای تحویل مدل‌ها وجود دارد:

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

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

تشخیص چهره

برای API تشخیص چهره، دو روش برای ارائه مدل‌ها وجود دارد:

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

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

ترجمه

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

  • اگر برنامه شما از گزینه شرط دانلود «دستگاه بیکار» استفاده می‌کند، توجه داشته باشید که این گزینه حذف شده و دیگر قابل استفاده نیست. شما همچنان می‌توانید از گزینه «شارژ دستگاه» استفاده کنید. اگر می‌خواهید رفتار پیچیده‌تری داشته باشید، می‌توانید فراخوانی RemoteModelManager.download را با منطق خودتان به تعویق بیندازید.

برچسب‌گذاری تصویر AutoML

اگر برنامه شما از گزینه وضعیت دانلود «دستگاه در حالت آماده به کار» استفاده می‌کند، توجه داشته باشید که این گزینه حذف شده و دیگر قابل استفاده نیست. شما همچنان می‌توانید از گزینه «شارژ دستگاه» استفاده کنید.

اگر رفتار پیچیده‌تری می‌خواهید، می‌توانید فراخوانی RemoteModelManager.download را با منطق خودتان به تعویق بیندازید.

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

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

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

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

قدیمی

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) {
    ...
}

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

قدیمی

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) {
    ...
}

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

حذف وابستگی‌های فایربیس (اختیاری)

این مرحله فقط زمانی اعمال می‌شود که این شرایط برقرار باشند:

  • کیت ML فایربیس تنها کامپوننت فایربیس مورد استفاده شماست.
  • شما فقط از API های روی دستگاه استفاده می کنید.
  • شما از مدل سروینگ استفاده نمی‌کنید.

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

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

قبل از

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

بعد از

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

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

قبل از

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

بعد از

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

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

دریافت کمک

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